import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/** 
* @author 朱宏亮
* @version 创建时间：2017年12月5日 下午12:21:04 
* 类说明 
* 未整合spring
* 发布者订阅模式
*/
public class PublisherTopic {

    private static final Logger log =  LoggerFactory.getLogger(PublisherTopic.class);

      //连接账号
      private final static String userName = "admin";
      //连接密码
      private final static String password = "admin";
      //连接地址
      private final static String brokerURL = "tcp://localhost:61616";
      //connection的工厂
      private ConnectionFactory factory;
      //连接对象
      private Connection connection;
      //一个操作会话
      private Session session;
      //目的地，其实就是连接到哪个队列，如果是点对点，那么它的实现是Queue，如果是订阅模式，那它的实现是Topic
      private Destination destination;
      //生产者，就是产生数据的对象
      private MessageProducer producer;
      
      public static void main(String[] args) {
          
          PublisherTopic ser = new PublisherTopic();
      
          ser.send();
      }
      
      private void send(){
          try {
              
              //根据用户名，密码，url创建一个连接工厂
              factory = new ActiveMQConnectionFactory(userName, password, brokerURL);
              
              //从工厂中获取一个连接
              connection = factory.createConnection();
              //connection.setClientID("Client-zhl"); // 为Connection指定ClientID，可以不设置
              connection.start();
              
              //创建一个session
              //第一个参数:是否支持事务，如果为true，则会忽略第二个参数，被jms服务器设置为SESSION_TRANSACTED
              //第二个参数为false时，paramB的值可为Session.AUTO_ACKNOWLEDGE，Session.CLIENT_ACKNOWLEDGE，DUPS_OK_ACKNOWLEDGE其中一个。
              //Session.AUTO_ACKNOWLEDGE为自动确认，客户端发送和接收消息不需要做额外的工作。哪怕是接收端发生异常，也会被当作正常发送成功。
              //Session.CLIENT_ACKNOWLEDGE为客户端确认。客户端接收到消息后，必须调用javax.jms.Message的acknowledge方法。jms服务器才会当作发送成功，并删除消息。
              //DUPS_OK_ACKNOWLEDGE允许副本的确认模式。一旦接收方应用程序的方法调用从处理消息处返回，会话对象就会确认消息的接收；而且允许重复确认。
              session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
              
              //创建一个到达的目的地
              destination = session.createTopic("topic朱宏亮"); //---------与点对点不同之处
              
              //从session中，获取一个消息生产者
              producer = session.createProducer(destination);
              
              //设置生产者的模式，有两种可选
              //DeliveryMode.PERSISTENT 当activemq关闭的时候，队列数据将会被保存，持久化
              //DeliveryMode.NON_PERSISTENT 当activemq关闭的时候，队列里面的数据将会被清空
              producer.setDeliveryMode(DeliveryMode.PERSISTENT);//
              
              //创建一条消息，当然，消息的类型有很多，如文字，字节，对象等,可以通过session.create..方法来创建出来
              TextMessage textMsg = session.createTextMessage("hello ActiveMQ");
            
              for(int i = 0 ; i < 10 ; i ++){
                  //发送一条消息
                  producer.send(textMsg);
                  log.info("发送消息成功:{}，序号:{}",textMsg.getText(),i);
              }
              
              producer.close();
              session.close();
              connection.close();
          } catch (JMSException e) {
              log.error("method send,error msg:{}",e.getMessage());
          }
      }
}
 